package com.jdk.demo.map.weakHashMap;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

/**WeakHashMap，此种Map的特点是：

当除了自身有对key的引用外，此key没有其他引用，那么GC之后此map会自动丢弃此值

当使用 WeakHashMap 时，即使没有显示的添加或删除任何元素，也可能发生如下情况：

调用两次size()方法返回不同的值；
两次调用isEmpty()方法，第一次返回false，第二次返回true；
两次调用containsKey()方法，第一次返回true，第二次返回false，尽管两次使用的是同一个key；
两次调用get()方法，第一次返回一个value，第二次返回null，尽管两次使用的是同一个对象。
举例来说：声明了两个Map对象，一个是HashMap，一个是WeakHashMap，同时向两个map中放入a、b两个对象，当HashMap remove掉a 并且将a、b都指向null时，WeakHashMap中的a将自动被回收掉。出现这个状况的原因是，对于a对象而言，当HashMap remove掉并且将a指向null后，除了WeakHashMap中还保存a外已经没有指向a的指针了，所以WeakHashMap会自动舍弃掉a，而对于b对象虽然指向了null，但HashMap中还有指向b的指针，所以WeakHashMap将会保留。

WeakHashMap 内部是通过弱引用来管理entry的，弱引用的特性对应到 WeakHashMap 上意味着什么呢？将一对key, value放入到 WeakHashMap 里并不能避免该key值被GC回收，除非在 WeakHashMap 之外还有对该key的强引用
 *
 */
public class Weakmap {

	public static void main(String[] args) throws Exception {
        String a = new String("a");
        String b = new String("b");
        Map<String, String> weakmap = new WeakHashMap<>();
        weakmap.put(a, "aaa");
        weakmap.put(b, "bbb");
        Map<String, String> map = new HashMap<>();
        map.put(a, "aaa");
        map.put(b, "bbb");

        map.remove(a);

        a = null;
        b = null;

        System.gc();
        Iterator<Map.Entry<String, String>> i = map.entrySet().iterator();
        while (i.hasNext()) {
            Map.Entry<String, String> en = i.next();
            System.out.println("map:"+en.getKey()+":"+en.getValue());
        }

        Iterator<Map.Entry<String, String>> j = weakmap.entrySet().iterator();
        while (j.hasNext()) {
            Map.Entry<String, String> en = j.next();
            System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
        }

        Thread.sleep(200000);
	}

}
